/*
面向对象
*/

#include <iostream>
#include <vector>

using namespace std;

class Interface
{
    virtual void f() = 0;
};

class Abstract : public Interface
{                             // 继承中只建议使用public继承
    virtual void f() final {} // 禁止重载
};

// 继承体系底层需要及时使用final禁止继承
class Implement final : public Abstract
{
};

/*
C++六大函数 构造函数 析构函数 拷贝构造函数 复制赋值函数 转移构造函数 转移复制函数
*/
class DemoClass final : Abstract // 禁止继承
{
public:
    DemoClass() = default; // 虽然编译器会自动生成，但是还是建议明确用default写出来 使用默认实现比较好 C++六大函数都可以使用default
    ~DemoClass() = default;

    DemoClass(const DemoClass &) = delete;   // 禁止使用拷贝构造函数 delete明确表示禁用某个函数形式 其不限于构造或析构函数 可以用于任何函数包括类成员函数和自由函数
    DemoClass &operator=(const DemoClass &); // 禁止使用复制赋值函数
};

class StrClass final
{
public:
    // 禁止隐式转换StrClass s = "123" 只能StrClass s = static_cast<StrClass>("123");或者StrClass a = (StrClass) "123"
    // 不仅可以增强可读性还能够约束对象的使用
    explicit StrClass(const char *str)
    {
        this->str = str;
    }

    void func()
    {
        cout << this->str << endl;
    }

private:
    const char *str;
};

// 委托构造
class Delegate final
{
public:
    Delegate(int a) : a(a) {} // 有参数

    Delegate() : Delegate(0) {} // 无参数
private:
    int a;
};

// using在c++17的扩展用法 类似于typedef
using mystr = string; // typedef mystr string;

// 现代C++中的成员变量可以在声明的同时进行初始化
class Init final
{
public:
    static mystr str1;

private:
    int a = 0;
    const string &str = "123";
    vector<int> v{1, 2, 3};

    inline static mystr name = "how"; // C++17 如果不是常量的静态变量可以使用内联变量初始化静态变量
    static const int x = 0;           // 如果是静态常量就无所谓了，直接初始化即可
};

mystr Init::str1 = "123"; //如果版本早于C++17 只能使用类外单独初始化

int main()
{

    // DemoClass dc;
    // DemoClass dc1 = dc;
}